gusucode.com > VC++ RingSDK界面库 > VC++ RingSDK界面库/code/libsrc/ringdows/ringtoolbar.cpp
/********************************************************************** // // // ########## ###### ######### # ###### # // ############# ########### ######### ######### ### // ######## # ### ## ############# ## ## ##### # #### // #### ## ## ### ### ### # # ##### ##### // # ### # # ## ## ## ## ### // ## ###### ## ## #### #### # # ## // ######### ### ## ### ####### ###### ## ## ### // ###### ## ###### ## ## #### # ## #### // ####### ## ###### ## ### ## ## ### ###### // ######### ## ###### ## ###### ### ## ### # ##### // ## ###### ####### ### #### ## ## ####### ######## ## #### // ## #### ### # ### ### ## ########## ###### ## #### // ## ## ## ######### #### # ## // # ### // ## // ### // ## // // // 临风程序界面类库 ringdows.lib //作者:临风 // //版本:1.0 // //声明:本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到 // 你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在 // 修改的同时给作者一份同样的副本。 // 本类库不得用于任何商业用途,如确实需要,请与作者联系。 // //e-mail:ringphone@sina.com // //原文件名:ringtoolbar.cpp // //本文件说明:工具栏实现代码,包括:RingToolBar和RingCoolBar // RingToolBar:普通工具栏,不可移动或可拖动 // RingCoolBar:类似IE的工具栏,不可拖动,但可容纳多个 // 工具栏或控件并支持在其范围内调整位置。 // **********************************************************************/ #define MAKE_SELF_LIB #include "ringdows.h" RingToolBar::RingToolBar() { InitCommonControls(); m_windowType = ITIS_TOOLBAR; m_btnSize.cx = m_btnSize.cy = 0; m_BarSize.cx = m_BarSize.cy = 0; m_fSize.cx = m_fSize.cy = 0; m_nMaxRow = 0; m_nfRows = 1; m_dockbar = NULL; m_img = m_imgHot = NULL; } RingToolBar::~RingToolBar() { if(m_img) ImageList_Destroy(m_img); if(m_imgHot) ImageList_Destroy(m_imgHot); } void RingToolBar::ReplaceStyle(DWORD dwsRemove,DWORD dwsReplace) { DWORD style = GetStyle(); style &= ~dwsRemove; style |= dwsReplace; SetStyle(style); } RingDockBar* RingToolBar::EnableDock(LPCTSTR szTitle,UINT uDockStyle,UINT uDockFlag,LPRECT lprcPos) { DWORD style = CCS_NORESIZE; if(!MASK_MATCH(uDockStyle,TBS_EX_NONE)) style |= TBSTYLE_FLAT; ReplaceStyle(0,style); //如果是非FLAT类型,顶端会留有空间以便绘制横线, //必须调用一下SetButtonSize才会取消该空间 DWORD dw = GetButtonSize(); SetButtonSize(LOWORD(dw),HIWORD(dw)); return RingBaseWnd::EnableDock(szTitle,uDockStyle,uDockFlag,lprcPos); } /////////////////////////////////////////////////////////////////////// // //重载RingControls的Create,szInitText参数为图象资源,该资源图片 //必须在本模块资源中或是BMP文件,并且按钮图片必须宽高一致紧密排列 //成一行或是16*15标准的TOOLBAR按钮图片(同资源编辑工具栏生成的图片,但 //不局限于16色),图片0,0位置像素必须是透明色 // /////////////////////////////////////////////////////////////////////// BOOL RingToolBar::Create(DWORD dwStyle,DWORD dwExStyle,LPCTSTR szInitText,UINT uId, int x,int y,int width,int height) { if(IsWindow()) return TRUE; //父窗口不能是控件 if(m_parent->IsControls()) return FALSE; RingDockSite* pSite; if(m_parent->GetWindowType() != ITIS_DOCKSITE) pSite = ((RingWnd*)m_parent)->CreateDockSite(TBS_FLAG_DOCKTOP); else pSite = (RingDockSite*)m_parent; if(pSite == NULL) return FALSE; if(dwStyle & TBSTYLE_FLAT) dwStyle |= CCS_NORESIZE; dwStyle |= WS_CHILD | WS_VISIBLE | TBSTYLE_BUTTON | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS | CCS_NODIVIDER | CCS_NOMOVEY; RingControls::Create(dwStyle,0,"",uId,x,y,width,height); //设置WM_NOTIFY消息接收窗口为pSite SendMessage(m_hWnd,TB_SETPARENT,(WPARAM)pSite->Handle(),0); SendMessage(m_hWnd,TB_BUTTONSTRUCTSIZE,sizeof(TBBUTTON),0); //允许多个IMAGELIST SendMessage(m_hWnd,CCM_SETVERSION,5,0); SetExStyle(dwExStyle); if(szInitText) { HBITMAP hbm; if(IS_INTRESOURCE(szInitText)) hbm = (HBITMAP)LoadBitmap(GetInstance(),szInitText); else hbm = (HBITMAP)LoadImage(GetInstance(),szInitText,IMAGE_BITMAP,0,0,LR_LOADFROMFILE); if(hbm) { SIZE size; int ncnt; GetBmpSize(hbm,&size); ncnt = size.cx; if(size.cy != 15) size.cx = size.cy; else size.cx = 16; m_img = ImageList_Create(size.cx,size.cy,ILC_COLOR32|ILC_MASK,ncnt/size.cx,4); ImageList_AddMasked(m_img,hbm,CLR_DEFAULT); DeleteObject(hbm); SetImageList(m_img); SetButtonSize(size.cx,size.cy); } } m_dockbar = RingBaseWnd::EnableDock(NULL,TBS_EX_NONE|TBS_EX_ALLLINE); //创建时为整行工具栏,如果是非FLAT类型,需要先取消CCS_NORESIZE类型, //EnableDock时dockbar获取到正确高度后再设置以便能控制工具栏位置 ReplaceStyle(0,CCS_NORESIZE); return (BOOL)m_hWnd; } //idBitmap:该图象只能在本模块资源中 BOOL RingToolBar::Create(int idBitmap,DWORD dwStyle/*=0*/,DWORD dwExStyle/*=0*/) { if(idBitmap > 0) return Create(dwStyle,dwExStyle,MAKEINTRESOURCE(idBitmap),gdwDockBarId++,0,0,0,0); else return Create(dwStyle,dwExStyle,NULL,gdwDockBarId++,0,0,0,0); } void RingToolBar::SetExStyle(DWORD dwExStyle) { if(dwExStyle != 0 && m_hWnd) { //Toolbar专有扩展属性必须用以下方法设置, DWORD dwStyle = SendMessage(m_hWnd,TB_GETEXTENDEDSTYLE,0,0); dwStyle |= dwExStyle; SendMessage(m_hWnd,TB_SETEXTENDEDSTYLE,0,dwStyle); } } /******************************************************* // //LoadToolbar: 调入工具栏资源,因为需要知道资源格式, // 以下代码部分摘自MFC // *******************************************************/ struct CToolBarData { WORD wVersion; WORD wWidth; WORD wHeight; WORD wItemCount; //WORD aItems[wItemCount] WORD* items() { return (WORD*)(this+1); } }; BOOL RingToolBar::LoadToolBar(UINT uid,DWORD dwStyle,DWORD dwExStyle,HINSTANCE hInst) { return LoadToolBar(MAKEINTRESOURCE(uid),dwStyle,dwExStyle,hInst); } BOOL RingToolBar::LoadToolBar(LPCTSTR lpszResourceName,DWORD dwStyle,DWORD dwExStyle,HINSTANCE hInst) { if(lpszResourceName == NULL) return FALSE; if(m_hWnd == NULL) if(!Create(0,dwStyle,dwExStyle)) return FALSE; HRSRC hRsrc = FindResource(hInst,lpszResourceName,RT_TOOLBAR); if(hRsrc == NULL) return FALSE; HGLOBAL hGlobal = LoadResource(hInst, hRsrc); if(hGlobal == NULL) return FALSE; CToolBarData* pData = (CToolBarData*)LockResource(hGlobal); if(pData == NULL || pData->wVersion != 1) return FALSE; BOOL bResult = FALSE; HBITMAP hbm = LoadBitmap(hInst,lpszResourceName); if(hbm) { bResult = TRUE; AddImage(hbm,pData->wWidth,pData->wHeight); DeleteObject(hbm); } DeleteAllButtons(); TBBUTTON tb; memset(&tb,0,sizeof(TBBUTTON)); tb.iString = -1; int iImg = 0; for(int i = 0; i < pData->wItemCount; i++) { tb.fsState = TBSTATE_ENABLED; if((tb.idCommand = pData->items()[i]) == 0) { // separator tb.fsStyle = TBSTYLE_SEP; // width of separator includes 8 pixel overlap if ((GetStyle() & TBSTYLE_FLAT)) tb.iBitmap = 6; else tb.iBitmap = 8; } else { // a command button with image tb.fsStyle = TBSTYLE_BUTTON; tb.iBitmap = iImg ++; } if(!SendMessage(m_hWnd,TB_ADDBUTTONS,1,(LPARAM)&tb)) return FALSE; } SetButtonSize(pData->wWidth + 7, pData->wHeight + 7); UnlockResource(hGlobal); FreeResource(hGlobal); Update(pData->wItemCount); return bResult; } //删除所有按钮 void RingToolBar::DeleteAllButtons() { int nCount = SendMessage(m_hWnd,TB_BUTTONCOUNT,0,0); while(nCount--) SendMessage(m_hWnd,TB_DELETEBUTTON,0,0); } /////////////////////////////////////////////////// // //加入或设置按钮图片,未设置,创建m_img并加入,已设置, //加入到m_img // /////////////////////////////////////////////////// int RingToolBar::AddImage(UINT id,int cx/*=16*/,int cy/*=15*/, COLORREF crMask/*=CLR_DEFAULT*/, HINSTANCE hInst/*=GetInstance()*/) { HBITMAP hbm = LoadBitmap(hInst,MAKEINTRESOURCE(id)); int nIdx = AddImage(hbm,cx,cy,crMask); DeleteObject(hbm); return nIdx; } int RingToolBar::AddImage(HBITMAP hbm,int cx/*=15*/,int cy/*=16*/, COLORREF crMask/*=CLR_DEFAULT*/) { return AddInterImage(hbm,cx,cy,crMask,m_img,TB_GETIMAGELIST,TB_SETIMAGELIST,TRUE); } int RingToolBar::AddHotImage(UINT id,int cx/*=16*/,int cy/*=15*/, COLORREF crMask/*=CLR_DEFAULT*/, HINSTANCE hInst/*=GetInstance()*/) { HBITMAP hbm = LoadBitmap(hInst,MAKEINTRESOURCE(id)); int nIdx = AddHotImage(hbm,cx,cy,crMask); DeleteObject(hbm); return nIdx; } int RingToolBar::AddHotImage(HBITMAP hbm,int cx/*=15*/,int cy/*=16*/, COLORREF crMask/*=CLR_DEFAULT*/) { return AddInterImage(hbm,cx,cy,crMask,m_imgHot,TB_GETHOTIMAGELIST,TB_SETHOTIMAGELIST,FALSE); } int RingToolBar::AddInterImage(HBITMAP hbm,int cx,int cy,COLORREF crMask, HIMAGELIST& imgInter,UINT uMsgGet,UINT uMsgSet, BOOL bSetButtonSize) { int nIdx = -1; if(hbm) { HIMAGELIST himl = (HIMAGELIST)::SendMessage(m_hWnd,uMsgGet,0,0); if(himl) //已存在并已设置 nIdx = ImageList_AddMasked(himl,hbm,crMask); else { SIZE size; int ncnt; GetBmpSize(hbm,&size); ncnt = size.cx/cx; if(bSetButtonSize) SetButtonSize(cx,cy); if(imgInter == NULL) imgInter = ImageList_Create(cx,cy,ILC_COLOR32|ILC_MASK,ncnt,4); //imgInter(m_img或m_imgHot有可能已创建但未设置进TOOLBAR,因此这里不能用else if(imgInter) { nIdx = ImageList_AddMasked(imgInter,hbm,crMask); himl = imgInter; } } ::SendMessage(m_hWnd,uMsgSet,0,(LPARAM)himl); } return nIdx; } BOOL RingToolBar::AddButtons(int num,LPCTBBUTTON lptb) { if(lptb == NULL) return FALSE; int cnt = GetButtonCount(); TBBUTTON tb = *lptb; if(m_dockbar && m_dockbar->IsVert() && lptb) tb.fsState |= TBSTATE_WRAP; BOOL bOK = SendMessage(m_hWnd,TB_ADDBUTTONS,num,(LPARAM)&tb); Update(cnt); return bOK; } BOOL RingToolBar::InsertButton(int index,LPCTBBUTTON lptb) { if(lptb == NULL) return FALSE; int cnt = GetButtonCount(); TBBUTTON tb = *lptb; if(m_dockbar && m_dockbar->IsVert() && lptb) tb.fsState |= TBSTATE_WRAP; BOOL bOk = SendMessage(m_hWnd,TB_INSERTBUTTON,index,(LPARAM)&tb); Update(cnt); return bOk; } BOOL RingToolBar::InsertButton(int index,int iBitmap,int idCmd, LPCTSTR szText/*=NULL*/,BYTE btStyle, BYTE btState,DWORD dwData) { int iString = -1; if(szText != NULL) iString = SendMessage(m_hWnd,TB_ADDSTRING,0,(LPARAM)szText); TBBUTTON tbButton; tbButton.iBitmap = iBitmap; tbButton.idCommand = idCmd; tbButton.fsState = btState; tbButton.fsStyle = (BYTE)(TBSTYLE_BUTTON | btStyle); tbButton.dwData = dwData; tbButton.iString = iString; if(m_dockbar && m_dockbar->IsVert()) tbButton.fsState |= TBSTATE_WRAP; int cnt = GetButtonCount(); BOOL bOk = SendMessage(m_hWnd,TB_INSERTBUTTON,index,(LPARAM)&tbButton); Update(cnt); return bOk; } BOOL RingToolBar::InsertSep(int index,int width/*=0*/,int id/*=0*/) { int cnt = GetButtonCount(); TBBUTTON tbButtons = {width,id,TBSTATE_ENABLED,TBSTYLE_SEP,{0,0},0,0}; BOOL bOk; if(m_dockbar && m_dockbar->IsVert()) tbButtons.fsState |= TBSTATE_WRAP; bOk = SendMessage(m_hWnd,TB_INSERTBUTTON,index,(LPARAM)&tbButtons); Update(cnt); return bOk; } RingControls* RingToolBar::InsertItem(int index,RingControls* item,DWORD dwStyle,UINT uId,int width,int height) { if(item) { RECT rt; item->SetParentObj(this); if(item->Handle() == NULL) item->Create(dwStyle,0,"",uId,0,0,width,height); if(uId == 0) uId = item->GetId(); GetWindowRect(item->Handle(),&rt); width = max((rt.right-rt.left),width); height = max((rt.bottom-rt.top),height); InsertButton(index,-1,uId,NULL,TBSTYLE_BUTTON,TBSTATE_INDETERMINATE); TBBUTTONINFO tb; tb.cbSize = sizeof(TBBUTTONINFO); tb.dwMask = TBIF_SIZE; tb.cx = width + 4; SendMessage(m_hWnd,TB_SETBUTTONINFO,uId,(LPARAM)&tb); //InsertSep(index,width + 4,uId); GetButtonRect(index,&rt); item->SetParent(m_hWnd); item->SetPos(rt.left + 2,rt.top,width,height); } return item; } BOOL RingToolBar::InsertText(int index,LPCTSTR szText) { if(szText == NULL) return FALSE; RingStatic *item = NewRingObj(itemof(RingStatic)); UINT uId = gdwDockBarId++; item->Create(SS_CENTERIMAGE,WS_EX_TRANSPARENT,0,uId,0,0,0,0); if(item && szText) { item->SetValue(szText); item->SizeFitText(); item->SetBkColor(CLR_INVALID); return (BOOL)InsertItem(index,item,0,0,0,HIWORD(GetButtonSize())); } return FALSE; } RingControls* RingToolBar::GetContrlolItem(UINT uId) { HWND hwnd = GetDlgItem(m_hWnd,uId); if(hwnd) { RingBaseWnd* obj = GetWindowPtr(hwnd); if(obj && obj->IsControls()) return (RingControls*)obj; } return NULL; } LRESULT RingToolBar::RingdowProc(HWND hWnd,RINGPARAMS param) { LRESULT res; switch(param.uMsg) { case WM_ERASEBKGND: if(GetStyle() & TBSTYLE_CUSTOMERASE) //CUSTOMERASE,默认处理,不进行背景绘制 break; if(m_dockbar && m_dockbar->DrawBkg(param.hdc)) return TRUE; break; case WM_SIZING: if(m_dockbar) return OnSizing(param); case WM_PAINT: res = DefaultProc(param); { //更新所有子窗口。InsertText加入的Static控件是透明的, //如果不更新,当Static控件被局部覆盖引起本消息,背景会覆盖该控件 //而Static控件的WM_PAINT消息却不能全部更新,导致文字消失。 HWND hwnd = GetChild(); while(hwnd) { InvalidateRect(hwnd,NULL,TRUE); hwnd = GetNextChild(hwnd); } } return res; /*case TB_SETBUTTONSIZE: { LRESULT res = DefaultProc(param); Update(GetButtonCount()); if(m_dockbar) m_dockbar->UpdateAllSite(); return res; }*/ default: { LRESULT res = CtlColorProc(m_hWnd,param); if(res != RM_NOTPROCESS) return res; break; } /* case WM_GETDRAGRECTS: return OnGETDRAGRECTS(hWnd,param); //*/ } return RingControls::RingdowProc(hWnd,param); } //计算工具栏横排和竖排的尺寸 void RingToolBar::CalcSize(LPSIZE lpsize/*=NULL*/) { RECT rc; int bw; int n = GetButtonCount(); TBBUTTON tb; //工具栏按钮有变动,最大行数置0,在WM_SIZING里重新计算 m_nMaxRow = 0; m_btnSize.cx = 0; m_BarSize.cx = m_BarSize.cy = 0; m_btnSize.cy = HIWORD(GetButtonSize()); for(int i=0;i<n;i++) { GetButton(i,&tb); if(tb.fsState & TBSTATE_HIDDEN) continue; if(GetButtonRect(i,&rc)) { bw = rc.right - rc.left; if(bw > m_btnSize.cx) m_btnSize.cx = bw; m_BarSize.cx += bw; } if((tb.fsState & TBSTATE_INDETERMINATE) || (tb.fsStyle & TBSTYLE_SEP)) { if(tb.idCommand !=0) { HWND hwnd = GetDlgItem(m_hWnd,tb.idCommand); if(hwnd && hwnd != m_hWnd) SetWindowPos(hwnd,0,rc.left,rc.top,0,0,SWP_NOSIZE); m_BarSize.cy += m_btnSize.cy; } else m_BarSize.cy += bw; } else m_BarSize.cy += m_btnSize.cy; } if(lpsize) { lpsize->cx = m_BarSize.cx; lpsize->cy = m_BarSize.cy; } } void RingToolBar::UpdateItems() { RECT rc; int n = GetButtonCount(); TBBUTTON tb; for(int i=0;i<n;i++) { GetButton(i,&tb); if(tb.fsState & TBSTATE_HIDDEN) continue; if(tb.fsState & TBSTATE_INDETERMINATE) { if(tb.idCommand !=0) { GetButtonRect(i,&rc); HWND hwnd = GetDlgItem(m_hWnd,tb.idCommand); if(hwnd && hwnd != m_hWnd) SetWindowPos(hwnd,0,rc.left,rc.top,0,0,SWP_NOSIZE); } } } } void RingToolBar::Update(int nOrgButtonCnt,LPRECT lprc/*=NULL*/, BOOL bUpdateFloatRect/*=TRUE*/,BOOL bSetPos/*=TRUE*/) { RECT rc; CalcSize(); if(lprc) CopyRect(&rc,lprc); else { SendMessage(m_hWnd,TB_AUTOSIZE,0,0); GetWindowRect(m_hWnd,&rc); OffsetRect(&rc,-rc.left,-rc.top); } if(m_dockbar && m_dockbar->IsVert()) { WrapToolBar(nOrgButtonCnt+2,&rc); m_BarSize.cy = rc.bottom - rc.top; if(m_dockbar->IsAllLineBar()) SetPos(0,0,rc.right - rc.left,m_dockbar->GetClientHeight(0),NULL,SWP_NOMOVE); } else { SendMessage(m_hWnd,TB_SETROWS,MAKELONG(1,TRUE),(LPARAM)&rc); UpdateItems(); //bSetPos:初始创建时为默认式样,其高度需要控制好,以后父窗口拖动时的处理则不再需要 if(bSetPos) { if(m_dockbar && m_dockbar->IsAllLineBar())//GetStyle() & TBSTYLE_FLAT) SetPos(0,0,m_BarSize.cx,m_btnSize.cy,NULL,SWP_NOMOVE|SWP_FRAMECHANGED); else SetPos(0,0,m_BarSize.cx,rc.bottom - rc.top,NULL,SWP_NOMOVE|SWP_FRAMECHANGED); } } if(bUpdateFloatRect) { m_fSize.cx = m_BarSize.cx; m_fSize.cy = m_btnSize.cy; } // UpdateClientSize(w,h); } //根据lprc计算最符合该矩形的窗口尺寸 LRESULT RingToolBar::OnSizing(RINGPARAMS& param) { int n,h = (int)HIWORD(SendMessage(m_hWnd,TB_GETBUTTONSIZE,0,0)); LPRECT lprc = (LPRECT)param.lParam; n = (lprc->bottom - lprc->top)/h; WrapToolBar(n,lprc); m_fSize.cx = lprc->right - lprc->left; m_fSize.cy = lprc->bottom - lprc->top; m_nfRows = n; return TRUE; } BOOL RingToolBar::OnParentNotify(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam) { if(uMsg == MYWM_SIZE) { //不需要绘制,本消息由DockBar通知,稍后DockBar会通知绘制 Update(GetButtonCount(),NULL,TRUE,FALSE); //CalcSize(); RECT rc; GetWindowRect(m_hWnd,&rc); if(IsVert(lParam)) { //SendMessage(m_hWnd,TB_SETROWS,MAKELONG(GetButtonCount(),TRUE),(LPARAM)&rc); //UpdateItems(); //GetWindowRect(m_hWnd,&rc); return rc.right - rc.left; //return m_BarSize.cx;//CalcReSizeV(wParam); } else { //SendMessage(m_hWnd,TB_SETROWS,MAKELONG(1,TRUE),(LPARAM)&rc); //UpdateItems(); //GetWindowRect(m_hWnd,&rc); return rc.bottom - rc.top; } } return FALSE; } /* // HWND:父窗口句柄 LRESULT RingToolBar::OnNotify(RINGPARAMS param) { switch(param.lpnmhdr->code) { case TTN_NEEDTEXT: { ((LPTOOLTIPTEXT)param.lParam)->hinst = m_hInst; return SendMessage(m_parent->Handle(),WM_RINGTOOLTIP,((LPTOOLTIPTEXT)param.lParam)->hdr.idFrom,param.lParam); } case TBN_DROPDOWN: { //LPNMTOOLBAR nm = (LPNMTOOLBAR)param.lParam; Errmsg("Asd"); return 0;//TBDDRET_NODEFAULT; } } return DefaultProc(param); } */ void RingToolBar::ChangeState(int state,RingDockSite* docksite/*=NULL*/) { if(docksite && m_dockbar && (m_dockbar->GetState() == TBS_FLAG_FLY || ((m_dockbar->GetState() & 0x2) != (state & 0x2)))) { //原始状态改变,横变竖或竖变横 int cnt = GetButtonCount(); //TBBUTTON tb; //tb. //for(int i=0;i<cnt;i++) //{ // if(GetButton(i,&tb)) if(state > TBS_FLAG_DOCKBOTTOM) { //tb.fsState |= TBSTATE_WRAP; RECT rc; SendMessage(m_hWnd,TB_SETROWS,MAKEWPARAM(cnt,TRUE),(LPARAM)&rc); } else { RECT rc; SendMessage(m_hWnd,TB_SETROWS,MAKEWPARAM(1,FALSE),(LPARAM)&rc); //tb.fsState &= ~TBSTATE_WRAP; //SendMessage(m_hWnd,TB_SETBUTTONINFO,i,(LPARAM)&tb); } //} //m_State = state; Update(cnt); } else { /* //m_State = state; if(m_dockbar && m_dockbar->GetState() == TBS_FLAG_FLY) { RECT rc; GetButtonRect(0,&rc); int row = (m_frc.bottom - m_frc.top - BARTOOLY)/((rc.bottom - rc.top)+m_BorderSpace*2); SendMessage(m_hWnd,TB_SETROWS,MAKEWPARAM(row,TRUE),(LPARAM)&rc); m_winpos.cx = rc.right - rc.left; m_winpos.cy = rc.bottom - rc.top; } //*/ } } //折行工具栏 void RingToolBar::WrapToolBar(int nRows,LPRECT lprc) { if(lprc == NULL) return; if(m_nMaxRow) nRows = min(nRows,m_nMaxRow); SendMessage(m_hWnd,TB_SETROWS,MAKEWPARAM(nRows,TRUE),(LPARAM)lprc); while(lprc->right - lprc->left < m_btnSize.cx) { nRows --; m_nMaxRow = nRows; SendMessage(m_hWnd,TB_SETROWS,MAKEWPARAM(nRows,TRUE),(LPARAM)lprc); } UpdateItems(); } BOOL RingToolBar::OnGetDragRects(int state,LPRECT lprc) { if(lprc) { switch(state) { case TBS_FLAG_FLY: lprc->left = lprc->top = 0; lprc->right = m_fSize.cx; lprc->bottom = m_fSize.cy; break; case TBS_FLAG_HORZ: lprc->left = lprc->top = 0; lprc->right = m_BarSize.cx; lprc->bottom = m_btnSize.cy; break; case TBS_FLAG_VERT: lprc->left = lprc->top = 0; lprc->right = m_btnSize.cx; lprc->bottom = m_BarSize.cy; break; } return TRUE; } return FALSE; } //停靠状态,响应停靠状态改变事件,返回-1:未改变,TRUE:已处理,0:未处理 BOOL RingToolBar::OnDockStateChange(int stateOld,int stateNew) { if(stateNew == stateOld) return -1; // m_State = param.wParam; if(stateNew != TBS_FLAG_FLY) { //原始状态改变,横变竖或竖变横 int cnt = GetButtonCount(); RECT rc; int w,h; if(IsVert(stateNew)) { WrapToolBar(cnt,&rc); CalcSize(); w = m_btnSize.cx; h = m_BarSize.cy; } else { WrapToolBar(1,&rc); //SendMessage(m_hWnd,TB_SETROWS,MAKEWPARAM(1,FALSE),(LPARAM)&rc); //UpdateItems(); CalcSize(); w = m_BarSize.cx; h = m_btnSize.cy; } // m_State = param.wParam; //不需要Update浮动状态 SetPos(0,0,w,h,NULL,SWP_NOMOVE); } else { RECT rc; //GetButtonRect(0,&rc); //int row = (m_fSize.cy)/(rc.bottom - rc.top); WrapToolBar(m_nfRows,&rc); } return TRUE; }